// 给 Uint8Array 扩展 toHexString 方法
Uint8Array.prototype.toHexString = function () {
    return Array.from(this)
        .map(byte => `0x${byte.toString(16).padStart(2, '0').toUpperCase()}`)
        .join(', ');
};

///uint8array作为串口通信数据时，校验是否通过
Uint8Array.prototype.crc = function () {
    return this.reduce((sum, byte) => sum + byte, 0) & 0xFF;
}


///判断是否是16进制字符串
String.prototype.isHexString = function () {
    return /^[0-9a-fA-F]+$/.test(this) && this.length % 2 === 0;
}

///判断是否是指定个数字节的16进制字符串，比如判断是否是4个字节的16进制字符串
String.prototype.isHexStringBytes = function (bytes) {
    return /^[0-9a-fA-F]+$/.test(this) && this.length === bytes * 2;
}

///判断是否是二进制字符串
String.prototype.isBinaryString = function () {
    return /^[01]+$/.test(this);
}
///二进制字符串转换成16进制字符串
String.prototype.binaryToHexString = function () {
    ///如果二进制字符串长度不是 8 的倍数，可以在前面补 0
    const binaryStr = this.padStart(Math.ceil(this.length / 8) * 8, '0');
    return binaryStr.match(/.{1,8}/g) // 每 8 位分组
        .map(byte => parseInt(byte, 2).toString(16).toUpperCase().padStart(2, '0')) // 转换成 16 进制
        .join('');
}

///2进制字符串转换uint8array
String.prototype.binaryStringToUint8Array = function () {
    // 1. 确保输入是二进制字符串（只能包含 '0' 和 '1'）
    if (!this.isBinaryString()) {
        return null;
    }
    // 2. 计算需要的 Uint8 数组长度（每 8 位为 1 字节）
    const byteLength = Math.ceil(this.length / 8);
    const bytes = new Uint8Array(byteLength);

    // 3. 在前面补 0，使其长度是 8 的倍数（保证每个字节完整）
    const paddedBinStr = this.padStart(byteLength * 8, '0');

    // 4. 逐个字节转换成 uint8
    for (let i = 0; i < byteLength; i++) {
        const byteStr = paddedBinStr.slice(i * 8, (i + 1) * 8); // 取 8 位
        bytes[i] = parseInt(byteStr, 2); // 二进制转 10 进制
    }
    return bytes;
}

///16进制字符串转换uint8array
String.prototype.hexStringToUint8Array = function () {
    if (!this.isHexString()) {
        return null;
    }
    const bytes = new Uint8Array(this.length / 2);
    for (let i = 0; i < this.length; i += 2) {
        bytes[i / 2] = parseInt(this.substr(i, 2), 16);
    }
    return bytes;
}

